package org.jeecg.modules.app.utils;

import org.jeecg.modules.app.utils.model.SensitivewordFilter;
import org.springframework.util.StringUtils;

import java.util.Iterator;
import java.util.Set;

public class TextUtil {

	public static boolean isEmpty(Object object) {
		if(object == null || "".equals(object)) {
			return true;
		}

		return false;
	}



    /**
     * 过滤emoji 或者 其他非文字类型的字符
     * @param source
     * @return
     */
    public static String filterEmoji(String source) {
        source = source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*");
        if (!containsEmoji(source)) {
            return source;//如果不包含，直接返回
        }
        //到这里铁定包含
        StringBuilder buf = null;

        int len = source.length();

        for (int i = 0; i < len; i++) {
            char codePoint = source.charAt(i);

            if (isEmojiCharacter(codePoint)) {
                if (buf == null) {
                    buf = new StringBuilder(source.length());
                }

                buf.append(codePoint);
            } else {
                buf.append("*");
            }
        }

        if (buf == null) {
            return source;//如果没有找到 emoji表情，则返回源字符串
        } else {
            if (buf.length() == len) {//这里的意义在于尽可能少的toString，因为会重新生成字符串
                buf = null;
                return source;
            } else {
                return buf.toString();
            }
        }

    }

    /**
     * 检测是否有emoji字符
     * @param source
     * @return 一旦含有就抛出
     */
    public static boolean containsEmoji(String source) {
        if (StringUtils.isEmpty(source)) {
            return false;
        }

        int len = source.length();

        for (int i = 0; i < len; i++) {
            char codePoint = source.charAt(i);

            if (isEmojiCharacter(codePoint)) {
                //do nothing，判断到了这里表明，确认有表情字符
                return true;
            }
        }

        return false;
    }

    //判断敏感词
    public static String checkSensitiveWord(String content) {
		SensitivewordFilter filter = new SensitivewordFilter();
		Set<String> set = filter.getSensitiveWord(content, 1);
		String result = null;
		Iterator<String> it = set.iterator();
		while (it.hasNext()) {
		   result = it.next();
		   break;
		}
		return result;
    }

    //正则判断输入内容
    public static boolean checkContent(String content) {
    	String reg = "^[a-zA-Z0-9_\\u4E00-\\u9FA5|\\uFE30-\\uFFA0  。.%?？ ！,， 、; ；: ：\"“”‘'（）() 《 》 〈 〉 【 】 『 』 「 」 ﹃ ﹄ 〔 〕 … -—_ ～ ﹏ ￥ ]+$";
    	if(content.isEmpty()) {
    		return true;
    	}
    	boolean flag = content.matches(reg);
    	return flag;
    }

    private static boolean isEmojiCharacter(char codePoint) {
        return (codePoint == 0x0) ||
                (codePoint == 0x9) ||
                (codePoint == 0xA) ||
                (codePoint == 0xD) ||
                ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
                ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
                ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
    }

}
